/*
 * Copyright (c) 2018-2021 mcumgr authors
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdbool.h>
#include "util/mcumgr_util.h"

int
ull_to_s(unsigned long long val, int dst_max_len, char *dst)
{
	unsigned long copy;
	int digit;
	int off;
	int len;

	/* First, calculate the length of the resulting string. */
	copy = val;
	for (len = 0; copy != 0; len++) {
		copy /= 10;
	}

	/* A value of 0 still requires one character ("0"). */
	if (len == 0) {
		len = 1;
	}

	/* Ensure the buffer can accommodate the string and terminator. */
	if (len >= dst_max_len - 1) {
		return -1;
	}

	/* Encode the string from right to left. */
	off = len;
	dst[off--] = '\0';
	do {
		digit = val % 10;
		dst[off--] = '0' + digit;

		val /= 10;
	} while (val > 0);

	return len;
}

int
ll_to_s(long long val, int dst_max_len, char *dst)
{
	unsigned long long ull;

	if (val < 0) {
		if (dst_max_len < 1) {
			return -1;
		}

		dst[0] = '-';
		dst_max_len--;
		dst++;

		ull = -val;
	} else {
		ull = val;
	}

	return ull_to_s(ull, dst_max_len, dst);
}
